#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <string.h>
#include <pthread.h>

// LVGL核心头文件
#include "../lvgl/lvgl.h"
// UI头文件，用于访问beepSwitch控件
#include "../UI/screens/ui_desktop.h"
// LVGL开关控件头文件
#include "../lvgl/src/widgets/lv_switch.h"

// 全局变量
static int beep_fd = -1;               // 蜂鸣器文件描述符
static int is_initialized = 0;         // 初始化状态标志
static pthread_t monitor_thread;       // 监控线程ID
static int thread_running = 0;         // 线程运行标志

// 控制蜂鸣器状态
void set_beep_state(int state) {
    if (!is_initialized || beep_fd == -1) {
        return;
    }

    // 1: 打开蜂鸣器, 0: 关闭蜂鸣器
    if (state) {
        write(beep_fd, "1", 1);
    } else {
        write(beep_fd, "0", 1);
    }
    fsync(beep_fd);
}

// 监控线程：检测开关状态并控制蜂鸣器
static void *beep_monitor_thread(void *arg) {
    while (thread_running) {
        // 确保UI控件已初始化
        if (ui_beepSwitch == NULL) {
            usleep(100000);  // 100ms后重试
            continue;
        }
        
        // 检查开关状态
        int state = lv_obj_has_state(ui_beepSwitch, LV_STATE_CHECKED) ? 1 : 0;
        
        // 控制蜂鸣器
        set_beep_state(state);
        
        // 降低CPU占用
        usleep(100000);  // 100ms检测一次
    }
    return NULL;
}

// 初始化蜂鸣器控制
int beep_control_init(void) {
    int fd;

    // 检查是否已初始化
    if (is_initialized) {
        return 0;
    }

    // 导出GPIO（这里假设使用GPIO 111，可根据实际硬件修改）
    fd = open("/sys/class/gpio/export", O_WRONLY);
    if (fd == -1) {
        perror("open export for beep failed");
        return -1;
    }
    write(fd, "111", 3);  // GPIO编号，根据实际硬件修改
    fsync(fd);
    close(fd);

    // 等待系统创建GPIO文件
    usleep(100000);

    // 设置GPIO为输出方向
    fd = open("/sys/class/gpio/gpio111/direction", O_WRONLY);
    if (fd == -1) {
        perror("open direction for beep failed");
        return -1;
    }
    write(fd, "out", 3);
    fsync(fd);
    close(fd);

    // 打开value文件以控制蜂鸣器
    beep_fd = open("/sys/class/gpio/gpio111/value", O_WRONLY);
    if (beep_fd == -1) {
        perror("open value for beep failed");
        return -1;
    }

    // 初始状态：关闭蜂鸣器
    set_beep_state(0);

    // 启动监控线程
    thread_running = 1;
    if (pthread_create(&monitor_thread, NULL, beep_monitor_thread, NULL) != 0) {
        perror("pthread_create for beep monitor failed");
        close(beep_fd);
        beep_fd = -1;
        return -1;
    }

    is_initialized = 1;
    return 0;
}

// 清理蜂鸣器控制资源
void beep_control_cleanup(void) {
    int fd;

    if (!is_initialized) {
        return;
    }

    // 停止监控线程
    thread_running = 0;
    pthread_join(monitor_thread, NULL);

    // 关闭蜂鸣器
    set_beep_state(0);
    close(beep_fd);
    beep_fd = -1;

    // 取消导出GPIO
    fd = open("/sys/class/gpio/unexport", O_WRONLY);
    if (fd != -1) {
        write(fd, "111", 3);  // 与初始化时使用的GPIO编号一致
        fsync(fd);
        close(fd);
    }

    is_initialized = 0;
}
    